{
  "nbformat": 4,
  "nbformat_minor": 0,
  "metadata": {
    "colab": {
      "name": "REML.ipynb",
      "provenance": [],
      "include_colab_link": true
    },
    "kernelspec": {
      "name": "python3",
      "display_name": "Python 3"
    }
  },
  "cells": [
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "view-in-github",
        "colab_type": "text"
      },
      "source": [
        "<a href=\"https://colab.research.google.com/github/Divyanshu-ISM/Machine-Learning-Deep-Learning/blob/main/REML.ipynb\" target=\"_parent\"><img src=\"https://colab.research.google.com/assets/colab-badge.svg\" alt=\"Open In Colab\"/></a>"
      ]
    },
    {
      "cell_type": "code",
      "metadata": {
        "id": "AmDxsY2aPXfM"
      },
      "source": [
        "import numpy as np\n",
        "import pandas as pd\n",
        "import matplotlib.pyplot as plt\n",
        "%matplotlib inline"
      ],
      "execution_count": null,
      "outputs": []
    },
    {
      "cell_type": "code",
      "metadata": {
        "id": "6SPsUkkCPb3R"
      },
      "source": [
        "#Initialization\n",
        "\n",
        "# Pi = 6000\n",
        "\n",
        "dx = 1000\n",
        "dy = 1000\n",
        "dz = 75\n",
        "\n",
        "B = 1 #RB/STB\n",
        "c = 3.5*(10**(-6)) #psi-1\n",
        "\n",
        "kx = 15 #mD\n",
        "phi= 0.18\n",
        "\n",
        "mu = 10 #cp\n",
        "\n",
        "dt = 1/24 #days\n",
        "\n",
        "#Well Block index wb\n",
        "\n",
        "wb = 3 # 0,1,2,3 (block 4)\n",
        "\n",
        "\n",
        "#Calclulation\n",
        "\n",
        "Ax = dy*dz #ft2\n",
        "\n",
        "Vb = dx*dy*dz #ft3\n",
        "\n",
        "qsc_wb = -150 #stb/d\n",
        "\n",
        "Tx = (0.001127)*(kx)*(Ax)/(mu*B*dx)\n",
        "\n",
        "M = 5.615*B*dt/Vb/phi/c"
      ],
      "execution_count": null,
      "outputs": []
    },
    {
      "cell_type": "code",
      "metadata": {
        "id": "a18kCny0QW2q",
        "colab": {
          "base_uri": "https://localhost:8080/",
          "height": 35
        },
        "outputId": "0a7b4bfb-818e-46e6-edc3-3b9444d9a718"
      },
      "source": [
        "t = np.arange(0,365+dt, dt)\n",
        "\n",
        "len(t)"
      ],
      "execution_count": null,
      "outputs": [
        {
          "output_type": "execute_result",
          "data": {
            "text/plain": [
              "8762"
            ]
          },
          "metadata": {
            "tags": []
          },
          "execution_count": 10
        }
      ]
    },
    {
      "cell_type": "code",
      "metadata": {
        "id": "j_LYqeEtPkpW"
      },
      "source": [
        "P = np.ones(5)*6000"
      ],
      "execution_count": null,
      "outputs": []
    },
    {
      "cell_type": "code",
      "metadata": {
        "id": "RKXMjvcwPmk5"
      },
      "source": [
        "#creating a space-time 2D matrix\n",
        "P_r = np.zeros((len(t),5))"
      ],
      "execution_count": null,
      "outputs": []
    },
    {
      "cell_type": "code",
      "metadata": {
        "id": "w5aogQfrQ6qO"
      },
      "source": [
        "wb = 3 #can ask user input as well.\n",
        "qsc = np.array([0,0,0,-150,0])\n",
        "\n",
        "#West Boundary Pressure\n",
        "P_w = 6000 #psi\n",
        "\n",
        "for j in range(1,len(t)):\n",
        "\n",
        "  for i in range(1, len(P)-1):\n",
        "\n",
        "    P_r[j,i] = P_r[j-1,i] + M*qsc[i] + M*(Tx*(P_r[j-1,i-1] - P_r[j-1,i]) + Tx*(P_r[j-1,i+1] - P_r[j-1,i]))\n",
        "  \n",
        "  P_r[j,0] = P_w\n",
        "\n",
        "  P_r[j,-1]= P_r[j-1,-1] +  M*qsc[-1] + M*(Tx*(P_r[j-1,-2] - P_r[j-1,-1]))"
      ],
      "execution_count": null,
      "outputs": []
    },
    {
      "cell_type": "code",
      "metadata": {
        "id": "DhZAHTeTP68e"
      },
      "source": [
        "temp = pd.DataFrame(P_r)"
      ],
      "execution_count": null,
      "outputs": []
    },
    {
      "cell_type": "code",
      "metadata": {
        "id": "ZcuvZQ7sQNWx"
      },
      "source": [
        "temp.loc[0,:] = P"
      ],
      "execution_count": null,
      "outputs": []
    },
    {
      "cell_type": "code",
      "metadata": {
        "id": "l2lkU9q4QOl9",
        "colab": {
          "base_uri": "https://localhost:8080/",
          "height": 407
        },
        "outputId": "380b8055-43fe-4b88-b633-95fb567ea226"
      },
      "source": [
        "temp"
      ],
      "execution_count": null,
      "outputs": [
        {
          "output_type": "execute_result",
          "data": {
            "text/html": [
              "<div>\n",
              "<style scoped>\n",
              "    .dataframe tbody tr th:only-of-type {\n",
              "        vertical-align: middle;\n",
              "    }\n",
              "\n",
              "    .dataframe tbody tr th {\n",
              "        vertical-align: top;\n",
              "    }\n",
              "\n",
              "    .dataframe thead th {\n",
              "        text-align: right;\n",
              "    }\n",
              "</style>\n",
              "<table border=\"1\" class=\"dataframe\">\n",
              "  <thead>\n",
              "    <tr style=\"text-align: right;\">\n",
              "      <th></th>\n",
              "      <th>0</th>\n",
              "      <th>1</th>\n",
              "      <th>2</th>\n",
              "      <th>3</th>\n",
              "      <th>4</th>\n",
              "    </tr>\n",
              "  </thead>\n",
              "  <tbody>\n",
              "    <tr>\n",
              "      <th>0</th>\n",
              "      <td>6000.0</td>\n",
              "      <td>6000.000000</td>\n",
              "      <td>6000.000000</td>\n",
              "      <td>6000.000000</td>\n",
              "      <td>6000.000000</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>1</th>\n",
              "      <td>6000.0</td>\n",
              "      <td>6000.000000</td>\n",
              "      <td>6000.000000</td>\n",
              "      <td>5999.257275</td>\n",
              "      <td>6000.000000</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>2</th>\n",
              "      <td>6000.0</td>\n",
              "      <td>6000.000000</td>\n",
              "      <td>5999.999534</td>\n",
              "      <td>5998.515483</td>\n",
              "      <td>5999.999534</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>3</th>\n",
              "      <td>6000.0</td>\n",
              "      <td>6000.000000</td>\n",
              "      <td>5999.998602</td>\n",
              "      <td>5997.774621</td>\n",
              "      <td>5999.998602</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>4</th>\n",
              "      <td>6000.0</td>\n",
              "      <td>5999.999999</td>\n",
              "      <td>5999.997207</td>\n",
              "      <td>5997.034689</td>\n",
              "      <td>5999.997206</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>...</th>\n",
              "      <td>...</td>\n",
              "      <td>...</td>\n",
              "      <td>...</td>\n",
              "      <td>...</td>\n",
              "      <td>...</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>8757</th>\n",
              "      <td>6000.0</td>\n",
              "      <td>5482.235609</td>\n",
              "      <td>4884.225152</td>\n",
              "      <td>4135.398963</td>\n",
              "      <td>4366.460761</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>8758</th>\n",
              "      <td>6000.0</td>\n",
              "      <td>5482.185232</td>\n",
              "      <td>4884.130471</td>\n",
              "      <td>4135.271401</td>\n",
              "      <td>4366.315703</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>8759</th>\n",
              "      <td>6000.0</td>\n",
              "      <td>5482.134858</td>\n",
              "      <td>4884.035798</td>\n",
              "      <td>4135.143848</td>\n",
              "      <td>4366.170656</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>8760</th>\n",
              "      <td>6000.0</td>\n",
              "      <td>5482.084488</td>\n",
              "      <td>4883.941132</td>\n",
              "      <td>4135.016304</td>\n",
              "      <td>4366.025620</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>8761</th>\n",
              "      <td>6000.0</td>\n",
              "      <td>5482.034122</td>\n",
              "      <td>4883.846473</td>\n",
              "      <td>4134.888770</td>\n",
              "      <td>4365.880596</td>\n",
              "    </tr>\n",
              "  </tbody>\n",
              "</table>\n",
              "<p>8762 rows × 5 columns</p>\n",
              "</div>"
            ],
            "text/plain": [
              "           0            1            2            3            4\n",
              "0     6000.0  6000.000000  6000.000000  6000.000000  6000.000000\n",
              "1     6000.0  6000.000000  6000.000000  5999.257275  6000.000000\n",
              "2     6000.0  6000.000000  5999.999534  5998.515483  5999.999534\n",
              "3     6000.0  6000.000000  5999.998602  5997.774621  5999.998602\n",
              "4     6000.0  5999.999999  5999.997207  5997.034689  5999.997206\n",
              "...      ...          ...          ...          ...          ...\n",
              "8757  6000.0  5482.235609  4884.225152  4135.398963  4366.460761\n",
              "8758  6000.0  5482.185232  4884.130471  4135.271401  4366.315703\n",
              "8759  6000.0  5482.134858  4884.035798  4135.143848  4366.170656\n",
              "8760  6000.0  5482.084488  4883.941132  4135.016304  4366.025620\n",
              "8761  6000.0  5482.034122  4883.846473  4134.888770  4365.880596\n",
              "\n",
              "[8762 rows x 5 columns]"
            ]
          },
          "metadata": {
            "tags": []
          },
          "execution_count": 20
        }
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "BA59xVw2RLdf"
      },
      "source": [
        "#Let's Apply machine learning to it now."
      ]
    },
    {
      "cell_type": "code",
      "metadata": {
        "id": "yPMqu7tGR9Rn"
      },
      "source": [
        "from sklearn import linear_model\n",
        "\n",
        "from sklearn.linear_model import LinearRegression"
      ],
      "execution_count": null,
      "outputs": []
    },
    {
      "cell_type": "code",
      "metadata": {
        "id": "vq6HoGKUQxyG"
      },
      "source": [
        "df = temp.copy()"
      ],
      "execution_count": null,
      "outputs": []
    },
    {
      "cell_type": "code",
      "metadata": {
        "id": "Wo6QLW91R7zV"
      },
      "source": [
        "df.columns = ['Block0','Block1','Block2','Block3','Block4']"
      ],
      "execution_count": null,
      "outputs": []
    },
    {
      "cell_type": "code",
      "metadata": {
        "id": "uCHKpHEISHLw"
      },
      "source": [
        "X = df[[ 'Block1', 'Block2', 'Block4']]\n",
        "\n",
        "y = df['Block3']"
      ],
      "execution_count": null,
      "outputs": []
    },
    {
      "cell_type": "code",
      "metadata": {
        "id": "bxZ8QiMCTq7_"
      },
      "source": [
        "from sklearn.model_selection import train_test_split"
      ],
      "execution_count": null,
      "outputs": []
    },
    {
      "cell_type": "code",
      "metadata": {
        "id": "gLVBD7fHT8So"
      },
      "source": [
        "X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=101)"
      ],
      "execution_count": null,
      "outputs": []
    },
    {
      "cell_type": "code",
      "metadata": {
        "id": "BAR8ulb9SXki"
      },
      "source": [
        "lm = LinearRegression()"
      ],
      "execution_count": null,
      "outputs": []
    },
    {
      "cell_type": "code",
      "metadata": {
        "id": "6eY6Rt4qSmOi",
        "colab": {
          "base_uri": "https://localhost:8080/",
          "height": 35
        },
        "outputId": "be97f186-41da-4b61-c6f8-9407e5864d58"
      },
      "source": [
        "lm.fit(X_train,y_train)"
      ],
      "execution_count": null,
      "outputs": [
        {
          "output_type": "execute_result",
          "data": {
            "text/plain": [
              "LinearRegression(copy_X=True, fit_intercept=True, n_jobs=None, normalize=False)"
            ]
          },
          "metadata": {
            "tags": []
          },
          "execution_count": 43
        }
      ]
    },
    {
      "cell_type": "code",
      "metadata": {
        "id": "4O2e-CdnUDYN",
        "colab": {
          "base_uri": "https://localhost:8080/",
          "height": 54
        },
        "outputId": "671d979b-4955-4a23-d18d-c5636a3ca14c"
      },
      "source": [
        "# The coefficients\n",
        "print('Coefficients: \\n', lm.coef_)"
      ],
      "execution_count": null,
      "outputs": [
        {
          "output_type": "stream",
          "text": [
            "Coefficients: \n",
            " [ 0.00000000e+00  7.77796549e+11  7.77796549e+11 -7.77796549e+11]\n"
          ],
          "name": "stdout"
        }
      ]
    },
    {
      "cell_type": "code",
      "metadata": {
        "id": "_rI2OyqiUGPy"
      },
      "source": [
        "y_p = lm.predict( X_test)"
      ],
      "execution_count": null,
      "outputs": []
    },
    {
      "cell_type": "code",
      "metadata": {
        "id": "2ztmm1vfUNWs",
        "colab": {
          "base_uri": "https://localhost:8080/",
          "height": 388
        },
        "outputId": "ed2b3c36-4a4b-42b0-e372-270009e8ab52"
      },
      "source": [
        "plt.figure(figsize=(12,4))\n",
        "\n",
        "plt.style.use('default')\n",
        "\n",
        "plt.plot(y_test,y_p)\n",
        "plt.xlabel('Y Test')\n",
        "plt.ylabel('Predicted Y')\n",
        "\n",
        "plt.grid()"
      ],
      "execution_count": null,
      "outputs": [
        {
          "output_type": "display_data",
          "data": {
            "image/png": "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nKwNGza4jcnKylJycnKjnFdLciEZ/lpOTo6kX/7gSr/kk5ub6/aHMysrSw6Hw/UHmQwbV31yfPnll3XNNdeoY8eOddZlLXpXaWmpDhw4oOjoaF1yySUKCAhwe/z37dunQ4cOuR5/1qLvOTtDSVwTLerXOf4a10Xfd74MuSb6rt/97nfat2+f27Z//OMf6tatmyQpNjZWUVFRbhk4nU5t2bLF7bp4/Phx7dixwzVm48aNqq6udv0PueTkZG3atEkVFRWuMVlZWerTp49PvQxfEre7Q9M6+5Nii4uLTVJSkklMTDR5eXlutwuprKw0xhizevVqs3z5cpObm2v2799vli1bZoKDg83DDz/sqnnmdiL333+/+fbbb82zzz7L7UQa0dkZ5uXlmQULFpjt27eb/Px88/7775sePXqY4cOHu8afua3PqFGjTE5Ojlm3bp3p2LFjjbf1IcOmU9OnNu/fv9/YbDbz0UcfnTOeteh9M2bMMNnZ2SY/P998+eWXJiUlxXTo0MEUFRUZY3653V3Xrl3Nxo0bzfbt201ycrJJTk52Hc9a9L7aMuSaaB215ch10Rrq+ntqDNdEX7d161bj7+9vFi5caPbv329ef/11ExwcbF577TXXmCVLlpjQ0FDz/vvvm927d5trr722xtvdDR482GzZssV88cUXplevXm63uzt+/LiJjIw048aNM3v27DErVqwwwcHB3O4OOLuZ+PTTT42kGr/y8/ONMb/ccmLQoEGmTZs2JiQkxAwcONA8//zzpqqqyq3up59+agYNGmQCAwNNjx49TGZmZhOfWctxdoaHDh0yw4cPN+3btzd2u93ExcWZ+++/3+1+vcYYc/DgQTN69GgTFBRkOnToYGbMmOF2+yZjyLCp1dTYz5kzx8TExJyzvoxhLfqCG2+80URHR5vAwEDTuXNnc+ONN7rdr7esrMzcfffdJiwszAQHB5s//vGP5ujRo241WIveVVuGXBOto7YcuS5aQ11/T43hmmgFH3zwgUlISDB2u9307dvXvPjii277q6urzdy5c01kZKSx2+1m5MiRZt++fW5j/vnPf5qbbrrJtGnTxjgcDjNhwgRTUlLiNubrr782l112mbHb7aZz585myZIljX5uDWEz5qz7MgAAAAAAAEvhPfYAAAAAAFgYjT0AAAAAABZGYw8AAAAAgIXR2AMAAAAAYGE09gAAAAAAWBiNPQAAAAAAFkZjDwAAAACAhdHYAwAAAABgYTT2AADAjTFGKSkpSk1NPWffsmXLFBoaqh9++MG1LTs7Wzabrdav7OzsBs3lTO3jx4839HQAAGj2/L09AQAA4FtsNpsyMzOVmJioF154QXfeeackKT8/X7NmzdJzzz2nLl26uMZfeumlOnr0qOvnqVOnyul0KjMz07Wtffv2TXcCAAC0MDxjDwAAzhETE6Onn35aM2fOVH5+vowxmjRpkkaNGqVx48a5jQ0MDFRUVJTrKygoSHa73fVzWFiYHnzwQXXu3FkhISFKSkpyewb/+++/1x/+8AeFhYUpJCRE/fv319q1a3Xw4EH9/ve/lySFhYXJZrPp1ltvbcJHAQAAa+AZewAAUKPx48dr1apVmjhxoq6//nrt2bNH33zzTb3r3HPPPdq7d69WrFihTp06adWqVUpLS1Nubq569eqlyZMn6/Tp09q0aZNCQkK0d+9etWnTRjExMXrnnXc0ZswY7du3Tw6HQ0FBQY1wpgAAWBuNPQAAOK8XX3xR/fv316ZNm/TOO++oY8eO9Tr+0KFDyszM1KFDh9SpUydJ0syZM7Vu3TplZmZq0aJFOnTokMaMGaPExERJUo8ePVzHn3kJf0REhEJDQz10VgAANC809gAA4LwiIiJ055136r333tN1111X7+Nzc3NVVVWl3r17u20vLy9XeHi4JGnKlCm66667tH79eqWkpGjMmDEaMGCAR+YPAEBLQGMPAABq5e/vL3//hv2TobS0VH5+ftqxY4f8/Pzc9rVp00aSdNtttyk1NVVr1qzR+vXrtXjxYj355JO69957L3ruAAC0BHx4HgAAaDSDBw9WVVWVioqKFBcX5/YVFRXlGhcTE6OMjAy9++67mjFjhpYvXy7plw/mk6SqqiqvzB8AACugsQcAAI2md+/eGjt2rG655Ra9++67ys/P19atW7V48WKtWbNGknTffffp448/Vn5+vnbu3KlPP/1U/fr1kyR169ZNNptNH374oX766SeVlpZ683QAAPBJNPYAAKBRZWZm6pZbbtGMGTPUp08fXXfdddq2bZu6du0q6Zdn4ydPnqx+/fopLS1NvXv31rJlyyRJnTt31vz58/XAAw8oMjJS99xzjzdPBQAAn2QzxhhvTwIAAAAAADQMz9gDAAAAAGBhNPYAAAAAAFgYjT0AAAAAABZGYw8AAAAAgIXR2AMAAAAAYGE09gAAAAAAWBiNPQAAAAAAFkZjDwAAAACAhdHYAwAAAABgYTT2AAAAAABYGI09AAAAAAAWRmMPAAAAAICF/Q85XGs9kt+NYwAAAABJRU5ErkJggg==\n",
            "text/plain": [
              "<Figure size 1200x400 with 1 Axes>"
            ]
          },
          "metadata": {
            "tags": []
          }
        }
      ]
    },
    {
      "cell_type": "code",
      "metadata": {
        "id": "PBEXlkI8URMl",
        "colab": {
          "base_uri": "https://localhost:8080/",
          "height": 72
        },
        "outputId": "6f57a2c0-0692-449f-d309-2ebeca986c4b"
      },
      "source": [
        "# calculate these metrics by hand!\n",
        "from sklearn import metrics\n",
        "\n",
        "print('MAE:', metrics.mean_absolute_error(y_test, y_p))\n",
        "print('MSE:', metrics.mean_squared_error(y_test, y_p))\n",
        "print('RMSE:', np.sqrt(metrics.mean_squared_error(y_test, y_p)))"
      ],
      "execution_count": null,
      "outputs": [
        {
          "output_type": "stream",
          "text": [
            "MAE: 12.39610236638533\n",
            "MSE: 333.5549822112349\n",
            "RMSE: 18.26348767928062\n"
          ],
          "name": "stdout"
        }
      ]
    },
    {
      "cell_type": "code",
      "metadata": {
        "id": "Db0svBdiXO_j"
      },
      "source": [
        "m_a_e = metrics.mean_absolute_error(y_test, y_p)\n",
        "m_s_e =  metrics.mean_squared_error(y_test, y_p)\n",
        "\n",
        "r_m_s_e =  np.sqrt(m_s_e)"
      ],
      "execution_count": null,
      "outputs": []
    },
    {
      "cell_type": "code",
      "metadata": {
        "id": "n2hVsVE-XbCM"
      },
      "source": [
        "d = {'Metrics':['Mean Absolute Error(Psi)', 'Mean Squared Error', 'Root Mean Sq. Error(Psi)'],\n",
        "     'Values':[m_a_e,m_s_e,r_m_s_e]}\n",
        "\n",
        "err = pd.DataFrame(d)"
      ],
      "execution_count": null,
      "outputs": []
    },
    {
      "cell_type": "code",
      "metadata": {
        "id": "mba_OPeOX7ud",
        "colab": {
          "base_uri": "https://localhost:8080/",
          "height": 138
        },
        "outputId": "9ae0f53c-2356-4d7c-bcec-949389adb278"
      },
      "source": [
        "err"
      ],
      "execution_count": null,
      "outputs": [
        {
          "output_type": "execute_result",
          "data": {
            "text/html": [
              "<div>\n",
              "<style scoped>\n",
              "    .dataframe tbody tr th:only-of-type {\n",
              "        vertical-align: middle;\n",
              "    }\n",
              "\n",
              "    .dataframe tbody tr th {\n",
              "        vertical-align: top;\n",
              "    }\n",
              "\n",
              "    .dataframe thead th {\n",
              "        text-align: right;\n",
              "    }\n",
              "</style>\n",
              "<table border=\"1\" class=\"dataframe\">\n",
              "  <thead>\n",
              "    <tr style=\"text-align: right;\">\n",
              "      <th></th>\n",
              "      <th>Metrics</th>\n",
              "      <th>Values</th>\n",
              "    </tr>\n",
              "  </thead>\n",
              "  <tbody>\n",
              "    <tr>\n",
              "      <th>0</th>\n",
              "      <td>Mean Absolute Error(Psi)</td>\n",
              "      <td>12.396102</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>1</th>\n",
              "      <td>Mean Squared Error</td>\n",
              "      <td>333.554982</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>2</th>\n",
              "      <td>Root Mean Sq. Error(Psi)</td>\n",
              "      <td>18.263488</td>\n",
              "    </tr>\n",
              "  </tbody>\n",
              "</table>\n",
              "</div>"
            ],
            "text/plain": [
              "                    Metrics      Values\n",
              "0  Mean Absolute Error(Psi)   12.396102\n",
              "1        Mean Squared Error  333.554982\n",
              "2  Root Mean Sq. Error(Psi)   18.263488"
            ]
          },
          "metadata": {
            "tags": []
          },
          "execution_count": 73
        }
      ]
    },
    {
      "cell_type": "code",
      "metadata": {
        "id": "gYxjUlKdVHff"
      },
      "source": [
        "# coeffecients = pd.DataFrame(lm.coef_,X.columns)\n",
        "# coeffecients.columns = ['Coeffecient']\n",
        "# coeffecients"
      ],
      "execution_count": null,
      "outputs": []
    },
    {
      "cell_type": "code",
      "metadata": {
        "id": "ZBHqpuEYVX5P"
      },
      "source": [
        "#Mock Predictions\n"
      ],
      "execution_count": null,
      "outputs": []
    },
    {
      "cell_type": "code",
      "metadata": {
        "id": "dI2LuCxSYhVz"
      },
      "source": [
        "# prediction"
      ],
      "execution_count": null,
      "outputs": []
    },
    {
      "cell_type": "code",
      "metadata": {
        "id": "cvmv-sKuYi5R"
      },
      "source": [
        ""
      ],
      "execution_count": null,
      "outputs": []
    }
  ]
}